﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace CreatingObjects3d
{
    [Serializable()]
    class ObjetoNiebla
    {
        private Color color;
        private char tipoNiebla;
        private float distanciaVisibilidad;

        /// <summary>
        /// Método constructor del objeto niebla. Recibe 3 colores(Red, Green, Blue), un char ['L'|'E'] para indicar
        /// el tipo de niebla, según sea LINEAR o EXPONENTIAL y un float para indicar la distancia de visibilidad de los objetos.
        /// </summary>
        /// <param name="red"></param>
        /// <param name="green"></param>
        /// <param name="blue"></param>
        /// <param name="tipoNiebla"></param>
        /// <param name="visibilidad"></param>
        public ObjetoNiebla(int red, int green, int blue, char tipoNiebla, float visibilidad)
        {
            color = System.Drawing.Color.FromArgb(red, green, blue);            
            this.tipoNiebla = tipoNiebla;
            distanciaVisibilidad = visibilidad;
        }

        #region Metodos Get

        /// <summary>
        /// Devuelve los colores RGB de la niebla en un array de enteros.
        /// </summary>
        /// <returns></returns>
        public int[] getColor()
        {
            int[] arrayColor = new int[3];
            arrayColor[0] = color.R;
            arrayColor[1] = color.G;
            arrayColor[2] = color.B;
            return arrayColor;            
        }

        #endregion Metodos Get

        #region Metodos Set

        /// <summary>
        /// Establece los colores que tendrá el objeto niebla.
        /// </summary>
        /// <param name="red"></param>
        /// <param name="green"></param>
        /// <param name="blue"></param>
        public void setColor(int red, int green, int blue)
        {
            color = System.Drawing.Color.FromArgb(red, green, blue);         
        }

        #endregion Metodos Set

        #region Metodos Get y Set C#

        /// <summary>
        /// Asigna o devuelve el tipo de niebla para el objeto niebla.
        /// </summary>
        public char TipoNiebla
        {
            get { return tipoNiebla; }
            set { tipoNiebla = value; }
        }

        /// <summary>
        /// Asigna o devuelve la distancia a la que serán visibles el resto de objetos.
        /// </summary>
        public float Visibilidad
        {
            get { return distanciaVisibilidad; }
            set { distanciaVisibilidad = value; }
        }

        #endregion Metodos Get y Set C#

        public override string ToString()
        {
            String codigo;
            codigo = "Fog{ color "+color.R/255f+" "+color.G/255f+" "+color.B/255f+" fogtype ";
            if (tipoNiebla == 'L' || tipoNiebla == 'l')
            {
                codigo += "\"LINEAR\" ";
            }
            else
            {
                codigo += "\"EXPONENTIAL\" ";
            }
            codigo += "visibilityRange "+distanciaVisibilidad+" }";
            return codigo;
        }
    }
}


/*
 
 * Fog{  
    color                     color_RGB  
    fogtype                 "Tipo_niebla"  
    visibilityRange     valor_real  
}

La niebla oscurece totalmente los objetos a través del color definido en su campo color.  
El campo visibilityRange indica la distancia en metros a la cual los objetos no son visualizados por el visitante. 
La visibilidad va decreciendo desde el punto donde se encuentra el visitante hasta el límite indicado por este campo, donde la visibilidad es nula. 
Los objetos más cercanos se verán débilmente afectados por la niebla.  

El campo fogType controla el grado con el que el color de la niebla afecta al resto de los objetos. 
El tipo por defecto es LINEAR, lo cual indica que la función que se utiliza para ocultar los objetos es lineal. 
La otra opción es EXPONENTIAL, con la que se emplea una función exponencial, dando lugar a un efecto de niebla más realista. 
 
 
 */
